package com.exmaple.deal;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.cloud.netflix.zuul.filters.discovery.PatternServiceRouteMapper;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
@EnableZuulProxy
public class MicroserviceDealGatewayZuulRatelimitOrignApplication {
	public static void main(String[] args) {
		SpringApplication.run(MicroserviceDealGatewayZuulRatelimitOrignApplication.class, args);
	}

	/**
	 * 该示例是将userservice-v1映射到/v1/uservice/中，常用于版本管理中，如APP端调用的API带有版本信息(服务-版本)，
	 * Zuul为这些不同版本的微服务应用生成以版本代号作为路由前缀定义的路由规则。
	 * 通过具有版本号前缀的URL路径，可以很容易通过路径表达式来归类和管理这些具有版本信息的微服务
	 * @return
	 */
	@Bean
	public PatternServiceRouteMapper serviceRouteMapper() {
		// 调用构造函数PatternServiceRouteMapper(String servicePattern, String
		// routePattern)
		// servicePattern指定微服务的正则
		// routePattern指定路由正则
		return new PatternServiceRouteMapper("(?<name>^.+)-(?<version>v.+$)", "${version}/${name}");
	}
	
	/**
	 * 	案例： http://bxd.tunnel.qydev.com -> 127.0.0.1:8040
	 * 	访问：http://bxd.tunnel.qydev.com/api-deal/deal/1  和  http://bxd.tunnel.qydev.com/api-deal/dealMock/1 各5次
	 *	然后分别访问：http://bxd.tunnel.qydev.com/api-deal/deal/1  和  http://bxd.tunnel.qydev.com/api-deal/dealMock/1 限流开启
	 * 	Orign限流策略：对访问zuul网关的路由的节点做限流:
	 * 		访问 microservice-deal-cloud 路由节点下的设置的Path匹配到的所有路径的访问总次数超过限流设置，限流开启。
	 * 	
	 * 	说明:（我使用了外网映射来测试Orign限流原理）
	 * 	1、使用两台主机(两个不同的IP地址)访问：http://bxd.tunnel.qydev.com/api-deal/deal/1  和  http://bxd.tunnel.qydev.com/api-deal/dealMock/1
	 * 	        发现在任意主机上访问如上两个URL，一旦任意请求被限流，所有的访问	  microservice-deal-cloud 的节点都将被限流。
	 * 	2、限流之后，访问 microservice-deal-cloud 设置的path路径/api-deal/**匹配到的路径都将被限流，但不影响该节点对其他路由节点的访问，即policy-list下所有的限流策略相互独立互不影响
	 * 	3、被限流的 路由节点 在指定的refresh-interval(本例子为60s)之后，限流限制被解除。此处的限流计时的开始时间为第一次请求被限流的时间，比如限流开启时间时10:00:00，那么到10:01:00期间所有
	 *	 访问 microservice-deal-cloud 路由节点的请求都将被限流，限流时间节点不会因请求次数而被重置。
	 *	4、Zuul Ratelimit Orign类型的限流策略是基于路由节点的，一旦该节点触发限流，通过网关转发该节点的请求都将被限流，非网关转发的请求仍能被该服务节点响应。
	 */
}
